/*
题目描述
如题，给定一棵有根多叉树，请求出指定两个点直接最近的公共祖先。

    输入格式
    第一行包含三个正整数 N,M,S，分别表示树的结点个数、询问的个数和树根结点的序号。
    接下来 N−1 行每行包含两个正整数 x,y，表示 x 结点和 y 结点之间有一条直接连接的边（数据保证可以构成树）。
    接下来 M 行每行包含两个正整数 a,b，表示询问 a 结点和 b 结点的最近公共祖先。

    输出格式
    输出包含 M 行，每行包含一个正整数，依次为每一个询问的结果。
*/

#include<bits/stdc++.h>
#define ll long long
#define int ll
#define endl "\n"
#define pii pair<int,int>
#define mii map<int,int>
#define umii unordered_map<int,int>
#define vec2(a) vector<vector<a>>
#define vec1(a) vector<a>
#define mp(a,b) make_pair(a,b)
#define max(a,b) (a<b?b:a)
#define min(a,b) (a<b?a:b)
#define INF 0x3f3f3f3f
#define LINF 0x3fffffffffffffff
#define i128 __int128
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
std::mt19937_64 rng(std::random_device{}());
std::uniform_int_distribution<std::uint64_t> dist(1,1e18+10);
const int mod=4611686018427387847;
const int MOD=1000000007;
int n,m,root;
vec2(int) g(5e5+10); //邻接表
vec1(int) dep(5e5+10); //每个节点的深度
vec1(int) fa(5e5+10); //每个节点的根节点
vec2(int) stlca(5e5+10,vec1(int)(32)); //每个节点的2次幂祖先
void init_st(){
	for(int i=1;i<=n;i++){ //每个节点向上爬一层即2的0次方 就是该节点的父节点
		stlca[i][0]=fa[i];
	}
	for(int k=1;k<=32;k++){
		for(int i=1;i<=n;i++){ //每个节点向上爬2的k次方即向上爬两次2的k-1次方
			if(stlca[i][k-1])
				stlca[i][k]=stlca[stlca[i][k-1]][k-1];
			else
				stlca[i][k]=0;
		}
	}
}
int query(int a,int b){ //询问两个节点的最近祖先节点
	if(dep[a]<dep[b]) swap(a,b); //保持a为更深的节点
	int diff=dep[a]-dep[b]; //两个节点深度差值
	for(int i=32;i>=0;i--){ //通过二进制向上查找与b深度相同的a的祖先节点
		if(diff&(1ll<<i)){
			a=stlca[a][i];
		}
	}
	if(a==b) return a; //若b就是a的祖先节点直接返回
	for(int k=32;k>=0;k--){ //向上2进制逼近二者的祖先节点
		if(stlca[a][k]!=stlca[b][k]){
			a=stlca[a][k],b=stlca[b][k];
		}
	}
	return stlca[a][0];
}
void solve(){
	cin>>n>>m>>root;
	for(int i=1;i<=n-1;i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v),g[v].push_back(u);
	}
	deque<int> que;
	vec1(int) fl(5e5+10);
	fl[root]=true;
	que.push_back(root);
	fa[root]=root;
	while(!que.empty()){ //层序遍历初始化每个节点的深度和每个节点的父节点
		int u=que.front();
		que.pop_front();

		for(int i=0;i<g[u].size();i++){
			int v=g[u][i];
			if(fl[v]){
				continue;
			}
			fl[v]=true;
			fa[v]=u,dep[v]=dep[u]+1;
			que.push_back(v);
		}
	}
	init_st(); //初始化每个节点的2次幂祖先节点
	while(m--){
		int x,y;
		cin>>x>>y;
		int ret=query(x,y);
		cout<<ret<<endl;
	}
}

signed main(){
	IOS
    int t;
    t=1;
    while(t--){
        solve();
    }
}
